/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package msnserver;

import java.rmi.RemoteException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.NoResultException;
import javax.persistence.Persistence;
import msncommonsc.Contacto;
import msncommonsc.EnumEstado;
import msncommonsc.Persona;

/**
 *
 * @author Martin
 */
public class ControladoraPersona {

    private static ControladoraPersona instancia;

    private ControladoraPersona() throws RemoteException {
    }

    public static ControladoraPersona getInstance() throws RemoteException {
        if (instancia == null) {
            instancia = new ControladoraPersona();
        }
        return instancia;

    }

    public Persona obtenerPersona(String nombre) {
        try {
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-h2databasePU");
            EntityManager em = factory.createEntityManager();
            Persona persona = (Persona) em.createNamedQuery("Persona.buscarPorNombre").setParameter("nombre", nombre).getSingleResult();
            return persona;
        } catch (NoResultException e) {
            Persona p = new Persona();
            Contacto c = (Contacto) p;
            c.setNombre("JPAXD");
            return p;
        }
    }

    public Contacto obtenerContacto(String nombre) {
        try {
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-h2databasePU");
            EntityManager em = factory.createEntityManager();
            Contacto contacto = (Contacto) em.createNamedQuery("Contacto.buscarPorNombre").setParameter("nombre", nombre).getSingleResult();
            return contacto;
        } catch (NoResultException e) {
            Contacto c = new Contacto();
            c.setNombre("JPAXD");
            return c;
        }
    }

    public Persona agrgarContacto(Persona persona, Contacto contacto) {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-h2databasePU");
        EntityManager em = factory.createEntityManager();
        Contacto c = (Contacto) em.createNamedQuery("Contacto.buscarPorNombre").setParameter("nombre", contacto.getNombre()).getSingleResult();
        Persona p = (Persona) em.createNamedQuery("Persona.buscarPorNombre").setParameter("nombre", persona.getNombre()).getSingleResult();
        em.getTransaction().begin();
        p.getMapaContactos().add(c);
        em.getTransaction().commit();
        return p;
    }

    public void persistirPersona(Persona persona) {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-h2databasePU");
        EntityManager em = factory.createEntityManager();
        em.getTransaction().begin();
        em.persist(persona);
        em.getTransaction().commit();
    }

    public Persona cambiarDatos(String nombre, String contraseña, String nick) {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-h2databasePU");
        EntityManager em = factory.createEntityManager();
        em.getTransaction().begin();
        Persona p = (Persona) em.createNamedQuery("Persona.buscarPorNombre").setParameter("nombre", nombre).getSingleResult();
        if (!"".equals(contraseña)) {
            p.setContraseña(contraseña);
        }
        if (!"".equals(nick)) {
            p.setNick(nick);
        }
        em.getTransaction().commit();
        return p;
    }

    public void cambiarEstado(EnumEstado estado, String nombre) {
        try {
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-h2databasePU");
            EntityManager em = factory.createEntityManager();
            em.getTransaction().begin();
            Persona p = (Persona) em.createNamedQuery("Persona.buscarPorNombre").setParameter("nombre", nombre).getSingleResult();
            p.setEstado(estado.toString());
            em.getTransaction().commit();
        } catch (Exception e) {
            throw new UnsupportedOperationException("Not yet implemented");
        }

    }

    public void guardarCombersacion(String nombre, Boolean boo)throws RemoteException {

        try {
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-h2databasePU");
            EntityManager em = factory.createEntityManager();
            em.getTransaction().begin();
            Persona p = (Persona) em.createNamedQuery("Persona.buscarPorNombre").setParameter("nombre", nombre).getSingleResult();
            p.setGuardarC(boo);
            em.getTransaction().commit();
        } catch (Exception e) {
            throw new UnsupportedOperationException("Not yet implemented");
        }

    }
}
